<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    // 1.严格模式的目的
    // 消除Javascript语法的一些不合理、不严谨之处，减少一些怪异行为;
    // 为未来新版本的Javascript做好铺垫。

    // 2.进入"严格模式"的标志
    "use strict";

    // 3.如何使用
    // 将"use strict"放在脚本文件的第一行，则整个脚本都将以"严格模式"运行
    // 将"use strict"放在函数体的第一行，则整个函数以"严格模式"运行。

    // 4.哪些语法和行为改变
    // 4.1.变量显式声明：一定加var
    // var a = 10; //全局属性,全局变量。
    // alert(a); //10
    // alert(window.a); //10
    // 任何变量都是window下面的属性。
    // 任何函数都是window下面的方法。

    // function fn() {
    //     alert('function');
    // }

    // fn();
    // window.fn();

    // 4.2.禁止使用with语句 - 了解
    // var obj = {
    //     a: 1,
    //     b: 2,
    //     c: 3
    // };

    // with(obj) {
    //     console.log(a);
    //     console.log(b);
    //     console.log(c);
    // }

    // 4.3禁止this关键字指向全局对象(window)
    // this指向函数的调用者。
    // function fn() {
    //     alert(this);
    // }
    // fn(); //这里不应该指向window，指向undefined。
    // window.fn(); //这里指向window

    // 4.4函数不能有重名的参数
    // function sum(a, a, b) {
    //     alert(a + a + b); //7
    // }
    // sum(1, 2, 3);

    // 4.5禁止八进制表示法
    // 八进制：0开头    十六进制：0x开头
    // var num = 012;
    // var num1 = 0x12345;
    // console.log(num);
    // console.log(num1);

    // 4.6不允许对arguments赋值 ,禁止使用arguments.callee/arguments.caller
    // arguments:类数组(类似数组)
    // arguments.callee表示函数指针。
    // function calc() {
    //     // arguments++; //这里会报错。
    //     for (var i = 0, sum = 0; i < arguments.length; i++) {
    //         sum += arguments[i];
    //     }
    //     alert(sum);
    // }
    // calc(1, 2, 3, 4, 5, 6);


    // function feibo(n) {
    //     if (n === 1) {
    //         return 0;
    //     }
    //     if (n === 2) {
    //         return 1;
    //     }
    //     return arguments.callee(n - 1) + arguments.callee(n - 2);
    // }
    // console.log(feibo(20)); //4181
</script>